<?php
/**
 * PrynLib
 * @copyright 2007-2009 Prynel
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @category libPrynel
 * @package Util
 * @version $Revision: 83 $
 */

/**
 * Classe ProgressBar. Permet de gérer une barre de progression sur des process long
 * 
 * @category libPrynel
 * @package Util
 * @version 1.0.0 
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @copyright  2007-2009 Prynel
 * @see demo/example_progress.php
 * 
 * <code>
 * $progress = new Util_ProgressBar();
 * $progress->setUpdateMethod('updateBar');
 * for($i=1;$i<=250;$i++)
 * {
 *    $progress->update($i,250);
 *    usleep(10000);
 * }
 * </code>
 */
class Util_ProgressBar
{
	/**
	 * Methode JS permettant la mise à jour
	 *
	 * @var string
	 */
	private $updateMethod;
	
	/**
	 * Méthode JS à appeler une fois le process terminé
	 *
	 * @var string
	 */
	private $finishMethod;
	
	public function __construct(){}
	
	/**
	 * Défini la méthode de fin (optionnelle)
	 *
	 * @param string $name
	 * @return Util_ProgressBar
	 */
	public function setFinishMethod($name)
	{
		$this->finishMethod = $name;
		return $this;
	}
	
	/**
	 * Défini la méthode de mise à jour de la barre
	 *
	 * @param string $name
	 * @return Util_ProgressBar
	 */
	public function setUpdateMethod($name)
	{
		$this->updateMethod = $name;
		return $this;
	}
	
	/**
	 * Envoi les données à la fonction JS de mise à jour
	 *
	 * @param int $current Etape actuelle
	 * @param int $max Nombre d étape totale
	 * @param int $timeUse Nombre de seconde passée
	 * @param int $timeLeft Nombre de secondes restante
	 * @param text $infos Infos complémentaire
	 */
	public function update($current=null,$max=null,$timeUse=null,$timeLeft=null,$infos=null)
	{
		$data = array(
			'current'	=>$current,
			'max'		=>$max,
			'percent'	=>floor(($current/$max)*100),
			'timeUse'	=>$timeUse,
			'timeLeft'	=>$timeLeft,
			'infos'		=>$infos
		);
		$jsString = '<script type="text/javascript">parent.'.$this->updateMethod.'('.json_encode($data).')</script>';
		$this->sendData($jsString);
	}
	
	/**
	 * Appel la fonction JS de fin.
	 * A utiliser une fois les étapes terminée
	 *
	 */
	public function finish()
	{
		$jsString = '<script type="text/javascript">parent.'.$this->finishMethod.'()</script>';
		$this->sendData($jsString);
	}
	
	/**
	 * Envoi les infos au navigateur
	 *
	 * @param string $data
	 */
	public function sendData($data)
	{
		//Permet à Safari d'executer le script.
		// Merci Zend_progress
		echo str_pad($data.'<br />',1024,' ',STR_PAD_RIGHT)."\n";
		flush();
		ob_flush();
	}
}
 ?>